from xtquant import xtdata
import time
from 基础配置 import settings
import os
from datetime import datetime
import json

# 1. 配置要监控的股票列表和周期
stock_codes = [s["all_code"] for s in settings.STOCK_CODE]  # 同时监控多只股票
period = "tick"  # 支持：tick(分笔)、1m/5m(分钟线)、1d(日线)
stock_type = {stock["all_code"]: stock["name"] for stock in settings.STOCK_CODE}

print(os.path.exists("/data"))  # 检查父目录是否存在
DATA_DIR = "tick_data"
try:
    os.makedirs(DATA_DIR, exist_ok=True)
    print(f"目录 {DATA_DIR} 创建成功或已存在")
except Exception as e:
    print(f"创建目录失败: {e}")


def save_tick_data(stock_code, tick_data):
    """
    保存tick数据到JSON文件
    格式: /股票代码/日期.json
    """
    # 获取当前日期作为文件名
    today = datetime.now().strftime("%Y-%m-%d")

    # 创建股票代码对应的目录
    stock_dir = os.path.join(DATA_DIR, stock_code)
    os.makedirs(stock_dir, exist_ok=True)

    # 完整的文件路径
    file_path = os.path.join(stock_dir, f"{today}.json")

    # 读取现有数据(如果文件存在)
    existing_data = []
    if os.path.exists(file_path):
        with open(file_path, 'r', encoding='utf-8') as f:
            existing_data = json.load(f)

    # 添加新数据
    existing_data.append({
        "timestamp": datetime.now().strftime("%H:%M:%S.%f"),
        "data": tick_data
    })

    # 写入文件
    with open(file_path, 'w', encoding='utf-8') as f:
        json.dump(existing_data, f, ensure_ascii=False, indent=2)

# 2. 定义行情回调函数
def quote_callback(data):
    """
    实时行情回调函数
    每次行情更新时会自动触发
    """
    # data是一个字典，key是股票代码，value是该股票的行情数据
    for stock_code, stock_data in data.items():
        stock_name = stock_type.get(stock_code)
        print(f"\n实时行情更新 @ {time.strftime('%H:%M:%S')}")
        print(f"股票: {stock_name}")
        print("最新数据:", stock_data)
        save_tick_data(stock_code, stock_data)

        # 这里可以添加针对不同股票的处理逻辑
        if stock_code == "513130.SH":
            # 对513130.SH的特殊处理
            pass
        elif stock_code == "600519.SH":
            # 对600519.SH的特殊处理
            pass


# 3. 批量订阅实时行情
for code in stock_codes:
    xtdata.subscribe_quote(
        code,
        period=period,
        count=-1,  # -1表示获取所有实时数据
        callback=quote_callback  # 设置回调函数
    )
    print(f"已订阅 {code} 的实时行情")

# 4. 启动事件循环（必须调用）
print(f"开始监听 {len(stock_codes)} 只股票的实时行情...")
try:
    xtdata.run()  # 阻塞程序，持续接收行情
except KeyboardInterrupt:
    print("\n程序已手动停止")